<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2982. 找出出现至少三次的最长特殊子字符串 II</title>
</head>
<body>
    <script>
    //         给你一个仅由小写英文字母组成的字符串 s 。

    // 如果一个字符串仅由单一字符组成，那么它被称为 特殊 字符串。例如，字符串 "abc" 不是特殊字符串，而字符串 "ddd"、"zz" 和 "f" 是特殊字符串。

    // 返回在 s 中出现 至少三次 的 最长特殊子字符串 的长度，如果不存在出现至少三次的特殊子字符串，则返回 -1 。

    // 子字符串 是字符串中的一个连续 非空 字符序列。

    

    // 示例 1：

    // 输入：s = "aaaa"
    // 输出：2
    // 解释：出现三次的最长特殊子字符串是 "aa" ：子字符串 "aaaa"、"aaaa" 和 "aaaa"。
    // 可以证明最大长度是 2 。
    // 示例 2：

    // 输入：s = "abcdef"
    // 输出：-1
    // 解释：不存在出现至少三次的特殊子字符串。因此返回 -1 。
    // 示例 3：

    // 输入：s = "abcaba"
    // 输出：1
    // 解释：出现三次的最长特殊子字符串是 "a" ：子字符串 "abcaba"、"abcaba" 和 "abcaba"。
    // 可以证明最大长度是 1 。
    

    // 提示：

    // 3 <= s.length <= 5 * 105
    // s 仅由小写英文字母组成。

    /**
 * @param {string} s
 * @return {number}
 */
var maximumLength = function(s) {
    // n 存储字符串的长度
    const n = s.length;
    // 创建一个长度为26的数组，每个元素是一个长度为3的数组，用来存储每个字母的最长、次长和第三长子串长度
    const cnt = Array.from({ length: 26 }, () => Array(3).fill(0));

    // i 是当前遍历到的位置
    let i = 0;
    // 当 i 还没有遍历完整个字符串时，继续遍历
    while (i < n) {
        // j 是当前相同字符序列的末尾
        let j = i;
        // 当 j 还在字符串范围内并且 s[j] 与 s[i] 相同，继续向后移动 j
        while (j < n && s[j] === s[i]) {
            j++;
        }
        // 计算当前字符在字母表中的索引（0-25）
        const index = s.charCodeAt(i) - 97;
        // 计算当前字符连续出现的长度
        const len = j - i;
        // 如果当前长度大于该字符的最长子串长度，更新数组
        if (len > cnt[index][0]) {
            [cnt[index][0], cnt[index][1], cnt[index][2]] = [len, cnt[index][0], cnt[index][1]];
        } else if (len > cnt[index][1]) {
            // 如果当前长度大于该字符的次长子串长度，更新数组
            [cnt[index][1], cnt[index][2]] = [len, cnt[index][1]];
        } else if (len > cnt[index][2]) {
            // 如果当前长度大于该字符的第三长子串长度，更新数组
            cnt[index][2] = len;
        }
        // 移动 i 到 j 的位置，即下一个不同的字符
        i = j;
    }

    // 初始化结果为 0
    let res = 0;
    // 遍历每个字符的长度数组
    for (const vec of cnt) {
        // 更新结果为当前最大值和三种可能情况的最大值
        res = Math.max(...[res, vec[0] - 2, Math.min(vec[0] - 1, vec[1])], vec[2]);
    }
    // 如果结果不为 0，返回结果，否则返回 -1
    return res !== 0 ? res : -1;
};
console.log(maximumLength('aaasaaasaaa'));
    </script>
</body>
</html>